﻿#define  _CRT_SECURE_NO_WARNINGS
#include<ctype.h>
#include<iostream>
#include<string>
using namespace std;

class Solution1 {
public:
    bool isAlphaOrNumber(char ch)
    {
        return (ch >= '0' && ch <= '9') || isalpha(ch);
    }

    bool isPalindrome(string s) {
        for (int i = 0; i < s.size(); ++i)
        {
            // 全部转为小写
            if (isupper(s[i]))
            {
                s[i] = tolower(s[i]);
            }
        }
        int left = 0;
        int right = s.size() - 1;
        while (left < right)
        {
            while (left < right && !isAlphaOrNumber(s[left]))
            {
                left++;
            }
            while (left < right && !isAlphaOrNumber(s[right]))
            {
                right--;
            }
            if (left < right && s[left] != s[right])
            {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
};

//~string()
//{
//    delete[] _str;
//    str = nullptr;
//    size = 0;
//    capacity = 0;
//}

//int main()
//{
//    string s = "0P";
//    Solution1().isPalindrome(s);
//
//
//    return 0;
//}

//class Solution {
//public:
//    bool isNumber(char ch)
//    {
//        return (ch >= '0' && ch <= '9');
//    }
//
//    int myAtoi(string str) {
//        long long ret = 0;
//        int flag = 1;
//        int i = 0;
//        while (i < str.size() && str[i] == ' ')
//        {
//            ++i;
//        }
//        for (; i < str.size(); ++i)
//        {
//            if (str[i] == '-' || str[i] == '+')
//            {
//                flag = str[i] == '-' ? -1 : 1;
//                ++i;
//            }
//            if (isNumber(str[i]))
//            {
//                if (ret * flag > INT_MAX)
//                {
//                    return INT_MAX;
//                }
//                if (ret * flag < INT_MIN)
//                {
//                    return INT_MIN;
//                }
//                ret *= 10;
//                ret += (str[i] - '0');
//            }
//            else
//            {
//                break;
//            }
//        }
//        // if (ret * flag > INT_MAX) 
//        // { 
//        //     return INT_MAX;
//        // }
//        // if (ret * flag < INT_MIN)
//        // { 
//        //     return INT_MIN;
//        // }
//        return (int)flag * ret;
//    }
//};

//class Solution {
//public:
//    int toNumber(char ch)
//    {
//        return ch - '0';
//    }
//    char toChar(int i)
//    {
//        return '0' + i;
//    }
//    string addStrings(string num1, string num2) {
//        int end1 = num1.size() - 1;
//        int end2 = num2.size() - 1;
//        int flag = 0; // 储存进位
//        int index = 0;
//        string ret;
//        while (end1 >= 0 && end2 >= 0)
//        {
//            index = toNumber(num1[end1]) + toNumber(num2[end2]) + flag;
//            if (index >= 10)
//            {
//                flag = 0;
//                index -= 10;
//                flag = 1;
//            }
//            else
//            {
//                flag = 0;
//            }
//            ret.insert(0, 1, toChar(index));
//            --end1;
//            --end2;
//        }
//        while (end1 >= 0)
//        {
//            index = toNumber(num1[end1]) + flag;
//            if (index >= 10)
//            {
//                flag = 0;
//                index -= 10;
//                flag = 1;
//            }
//            else
//            {
//                flag = 0;
//            }
//            ret.insert(0, 1, toChar(index));
//            --end1;
//        }
//        while (end2 >= 0)
//        {
//            index = toNumber(num2[end2]) + flag;
//            if (index >= 10)
//            {
//                flag = 0;
//                index -= 10;
//                flag = 1;
//            }
//            else
//            {
//                flag = 0;
//            }
//            ret.insert(0, 1, toChar(index));
//            --end2;
//        }
//        if (flag == 1)
//        {
//            ret.insert(0, 1, '1');
//        }
//        return ret;
//    }
//};

class Solution {
public:
    void reverse(string& s, int left, int right)
    {
        while (left < right)
        {
            swap(s[left], s[right]);
            left++;
            right--;
        }
    }
    string reverseWords(string s) {
        int pos1 = -1;
        int pos2 = 0;
        while ((pos2 = s.find(' ', pos1 + 1)) != string::npos)
        {
            reverse(s, pos1 + 1, pos2 - 1);
            pos1 = pos2;
        }
        reverse(s, pos1 + 1, s.size() - 1);
        return s;
    }
};

int main()
{
    Solution().reverseWords("Let's take LeetCode contest");
    return 0;
}

//int main()
//
//{
//
//    string strText = "How are you?";
//
//    string strSeparator = " ";
//
//    string strResult;
//
//    int size_pos = 0;
//
//    int size_prev_pos = 0;
//
//    while ((size_pos = strText.find_first_of(strSeparator, size_pos)) != string::npos)
//
//    {
//
//        strResult = strText.substr(size_prev_pos, size_pos - size_prev_pos);
//
//        cout << strResult << " ";
//
//        size_prev_pos = ++size_pos;
//
//    }
//
//    if (size_prev_pos != strText.size())
//
//    {
//
//        strResult = strText.substr(size_prev_pos, size_pos - size_prev_pos);
//
//        cout << strResult << " ";
//
//    }
//
//    cout << endl;
//
//    return 0;
//
//}







